package com.snopy.leetcode.index1_1000.index701_800;

/**
 * @author snopy
 * @version 1.0.0
 * @classname Question762
 * @description 二进制表示中质数个计算置位
 *
 * 给你两个整数left和right ，在闭区间 [left, right]范围内，统计并返回 计算置位位数为质数 的整数个数。
 *
 * 计算置位位数 就是二进制表示中 1 的个数。
 *
 * 例如， 21的二进制表示10101有 3 个计算置位。
 * 
 *
 * 示例 1：
 *
 * 输入：left = 6, right = 10
 * 输出：4
 * 解释：
 * 6 -> 110 (2 个计算置位，2 是质数)
 * 7 -> 111 (3 个计算置位，3 是质数)
 * 9 -> 1001 (2 个计算置位，2 是质数)
 * 10-> 1010 (2 个计算置位，2 是质数)
 * 共计 4 个计算置位为质数的数字。
 * 示例 2：
 *
 * 输入：left = 10, right = 15
 * 输出：5
 * 解释：
 * 10 -> 1010 (2 个计算置位, 2 是质数)
 * 11 -> 1011 (3 个计算置位, 3 是质数)
 * 12 -> 1100 (2 个计算置位, 2 是质数)
 * 13 -> 1101 (3 个计算置位, 3 是质数)
 * 14 -> 1110 (3 个计算置位, 3 是质数)
 * 15 -> 1111 (4 个计算置位, 4 不是质数)
 * 共计 5 个计算置位为质数的数字。
 *
 * @email 77912204@qq.com
 * @date 2022/04/05 8:31
 */
public class Question762 {

    public static void main(String[] args) {
        int c = countPrimeSetBits(3,7);
        System.out.println(c);
    }
    /**
     * @Description
     * @param left:
     * @param right:
     * @return: int
     * @Date 2022-04-05
     * @Author txl77912204@gmail.com
     **/
    public static int countPrimeSetBits(int left, int right) {
        int count = 0;
        for (int i = left;i<=right;i++){
            if (isPrimeNum(Integer.bitCount(i))){
                count++;
            }
        }
        return count;
    }
    /**
     * @Description 判断是否为质数
     * @param num:
     * @return: boolean
     * @Date 2022-04-05
     * @Author txl77912204@gmail.com
     **/
    private static boolean isPrimeNum(int num){
        if (num<2){
            return false;
        }
        int n = (int)Math.sqrt(num);
        for (int i = 2;i<=n;i++){
            if (num % i ==0){
                return false;
            }
        }
        return true;
    }
}
